package qgs.zisu.javaconcurrency.javaconcurrency.chapter5_join;

import java.util.Optional;
import java.util.stream.IntStream;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/22 20:02
 * @Version 1.0
 * join ()   // 这个线程 等到你自然结束
 * join(long mills)  //这个线程最多等你这么长时间，到时间我就强行将你结束掉，
 *
 * join用法： 比如我现在要开多个线程分别取采集不同数据源，我只有等所有线程采集完成 才能执行DB入库，所以这时候就要用到join
 *
 * 多线程的执行效率是去决议堆的 大小的。
 */public class ThreadJoin {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            IntStream.range(1,1000)     //0-1000
                    .forEach(i->System.out.println(Thread.currentThread().getName()+"->"+i));
        });
        Thread t2 = new Thread(()->{
            IntStream.range(1,1000)     //0-1000
                    .forEach(i->System.out.println(Thread.currentThread().getName()+"->"+i));
        });
        t1.start();
        t2.start();
        //加入join 就会使 t1线程执行完再执行后面的东西（main 线程里面的东西）
        //解释：Waits for this thread to die. 阻塞住等待这个线程死掉。
        t1.join();

        //如果同时new出了两个线程，并且这两个线程有join，那么这两个线程是交叉执行的，他们都结束之后才会轮到外面main线程。
        t2.join();

        /**
         *如果是这样的话，那么就是t1 线程执行完了再执行t2 线程
         *         t1.start();
         *         t1.join();
         *         t2.start();
         *         t2.join();
         **/

        Optional.of("All of tasks finish done.").ifPresent(System.out::print);


        // 这个是main 线程下执行的，这个是在t1 和 t2 两个线程都执行完毕了，再执行，因为加了 t1.join()、t2.join()
        //0-1000
        IntStream.range(1,1000)
                .forEach(i->System.out.println(Thread.currentThread().getName()+"->"+i));
    }
}
